﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Mindfor.Web.Data;
using NHibernate;
using NHibernate.Linq;

namespace Mindfor.Web.Modules.FeedBack
{
	public class FeedBackModule : ModuleBase
    {
		/// <summary>
		/// Custom role name for FeedBack Module.  
		/// FeedBack managers automaticaly recieve email notifications about new feedback items.
		/// </summary>
		public const string FeedBackRole = "FeedBackManager";

		/// <summary>
		/// Default page size for feedback index-page.
		/// </summary>
		public const string IndexPageSizeOption = "IndexPageSize";

		/// <summary>
		/// If email enabled - user should input it before send feedback.
		/// </summary>
		public const string EmailEnabledOption = "EmailEnabled";

		/// <summary>
		/// If phone enabled - user should input it before send feedback.
		/// </summary>
		public const string PhoneEnabledOption = "PhoneEnabled";

		/// <summary>
		/// Mail template notification about new feedback item..
		/// </summary>
		public const string MailTemplateNewFeedback = "NewFeedBack";

		/// <summary>
		/// Register method - creates custom news module role.
		/// </summary>
		public override void Register(ModuleRegistrationData info)
		{
			base.Register(info);

			// create role if one does not exist
			Role role = info.Data.Query<Role>().FirstOrDefault(r => r.Name == FeedBackRole);
			if (role == null)
			{
				role = new Role()
				{
					Name = FeedBackRole,
					FriendlyName = "Менеджер отзывов",
					Description = "Позволяет управлять списком отзывов"
				};
				using (ITransaction t = info.Data.BeginTransaction())
				{
					info.Data.Save(role);
					t.Commit();
				}
			}

			// create options
			bool optionsChanged = false;
			ModuleOption indexPageSizeOption = Options[IndexPageSizeOption];
			if (indexPageSizeOption == null)
			{
				indexPageSizeOption = new ModuleOption(IndexPageSizeOption, ModuleOptionType.Integer, 10, "Кол-во элементов на странице пользователя");
				Options.Add(indexPageSizeOption);
				optionsChanged = true;
			}

			ModuleOption emailEnabledOption = Options[EmailEnabledOption];
			if (emailEnabledOption == null)
			{
				emailEnabledOption = new ModuleOption(EmailEnabledOption, ModuleOptionType.Boolean, false, "Определяет, является ли необходимым для пользователя оставить свой email перед отправкой отзыва. Влияет на отображение этого поля.");
				Options.Add(emailEnabledOption);
				optionsChanged = true;
			}

			ModuleOption phoneEnabledOption = Options[PhoneEnabledOption];
			if (phoneEnabledOption == null)
			{
				phoneEnabledOption = new ModuleOption(PhoneEnabledOption, ModuleOptionType.Boolean, false, "Определяет, является ли необходимым для пользователя оставить свой телефон перед отправкой отзыва. Влияет на отображение этого поля.");
				Options.Add(phoneEnabledOption);
				optionsChanged = true;
			}

			if (optionsChanged)
				Options.Save(info.Data);

			// create email template
			MailTemplateType newfeedbackTemplateType = info.Data.Query<MailTemplateType>().Get(MailTemplateNewFeedback, Name);
			if (newfeedbackTemplateType == null)
			{
				using (ITransaction t = info.Data.BeginTransaction())
				{
					newfeedbackTemplateType = new MailTemplateType(MailTemplateNewFeedback, Name);
					newfeedbackTemplateType.Description = "{login} - login\n{url} - feedback module admin index url\n{date} - date";
					info.Data.Save(newfeedbackTemplateType);
					t.Commit();
				}
			}
		}

    }
}
